/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package modeladesktop.algoritmo;

import modeladesktop.gui.Analisis;
import org.apache.commons.math.stat.correlation.PearsonsCorrelation;
import org.apache.commons.math.stat.regression.MultipleLinearRegression;
import org.apache.commons.math.stat.regression.OLSMultipleLinearRegression;
import org.apache.commons.math.stat.regression.SimpleRegression;

/**
 *
 * @author Administrador
 */
public class Regresion {

	public Regresion() {
	}


    /*este metodo te regresa un vector con los coeficientes donde b[0] es betha 0 y asi etc.....
     *
     */
	public static void calcRegMultiple(Analisis analizado,double[] y, double[][] x) {

		OLSMultipleLinearRegression regression = new OLSMultipleLinearRegression();

		System.out.println("tamanio X "+x.length);
		System.out.println("tamanio X[] "+x[0].length);
		regression.newSampleData(y, x);
		double[] b = regression.estimateRegressionParameters();
		double[] sb = regression.estimateRegressionParametersStandardErrors();
		double[] betha = regression.estimateRegressionParameters();
		double[] res = regression.estimateResiduals();
//		double[] fiv = Coeficientes.getFiv(x);
		double regresVar = regression.estimateRegressandVariance();
		analizado.analisisRegresion = new Object[b.length][5];
		System.out.println("LEEEEEEENGTH "+b.length);
		for(int i = 0; i < b.length; i++){
			analizado.analisisRegresion[i][0] = b[i];
			analizado.analisisRegresion[i][1] = sb[i];
			analizado.analisisRegresion[i][2] = b[i]/sb[i];
		}

		analizado.coeficientesEcuacion=b;

		System.out.println("res = " + res[0]);
		System.out.println("res = " + res[1]);
		System.out.println("res = " + res[2]);
		System.out.println("Resg var : "+regresVar);
		double [][] coso = regression.estimateRegressionParametersVariance();
		for(double [] vec : coso){
			for(double datito : vec)
				System.out.print(datito + " - ");
			System.out.println();
		}

		double[] yPredecida=new double[y.length];

		for(int i=0;i<yPredecida.length;i++)
			for(int j=0;j<betha.length;j++)
				yPredecida[i]+=(j==0)?Regresion.Redondear(betha[j],0):(Regresion.Redondear(x[i][j],2)*Regresion.Redondear(betha[j],2));

		analizado.depPredecida=yPredecida;
		System.out.println("parametro b0 = " + b[0]);
		System.out.println("parametro b1 = " + b[1]);
		System.out.println("parametro b2 = " + b[2]);

		//modificar se llena los bethas internamente ya no externamente
		analizado.coeficientesEcuacion=betha;
		/*fin dela modifiacion*/


		System.out.println("parametro b0 SE = " + sb[0]);
		System.out.println("parametro b1 SE = " + sb[1]);
		System.out.println("parametro b1 SE = " + sb[2]);



		System.out.println("T1 = " + (b[0] / sb[0]));
		System.out.println("T2 = " + b[1] / sb[1]);
		System.out.println("T3 = " + b[2] / sb[2]);

		System.out.println(regression.estimateRegressionParametersVariance()[1][1]);
        for(int i=0;i<betha.length;i++){
            System.out.println("b"+i+" "+betha[i]);
        }
      
		analizado.N=yPredecida.length;
		analizado.K=x[0].length-1;
	}



    public static double   Redondear(double  nD, int  nDec)
	{
	  return Math.round(nD*Math.pow(10,nDec))/Math.pow(10,nDec);
	}

	/**
		Regresa un vector con el betha0 y betha 1 para la regresion simple en el caso que solo sea una variable independiente
	*/
	public static double[] calcRegSimple(Analisis analizado, double[][] data){
		double[] ecuacion = new double[3];
		SimpleRegression regSimple = new SimpleRegression();

		regSimple.addData(data);

		ecuacion[0] = regSimple.getIntercept(); // betha0
		ecuacion[1] = regSimple.getSlope();     // betha1
		ecuacion[2] = regSimple.getSlopeStdErr(); //error estandar
		//Calcular Y Predecida y coeficientes de la ecuacion darn1986
		double[] yPredecida=new double[data.length];

		for(int i=0;i<yPredecida.length;i++)
			yPredecida[i]=regSimple.predict(data[i][0]);

		analizado.N=yPredecida.length;
		analizado.K=data[0].length-1;
		analizado.depPredecida=yPredecida;
		analizado.coeficientesEcuacion=ecuacion;
		return ecuacion;
	}
    
    //regresa el coeficiente de correlacion de los datos para la regresion simple
	public static double coefCorr(double[][] data){

		SimpleRegression regSimple = new SimpleRegression();
		regSimple.addData(data);

		return regSimple.getR();
	}

    //regresa el coeficiente de determinacion para regresion simple
	public static double coefDet(double[][] data){

		SimpleRegression regSimple = new SimpleRegression();
		regSimple.addData(data);

		return regSimple.getRSquare();
	}
	
//	regression.getSlopeStdErr();
	
}

